package LeetCode1;

import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;

/**
 * 查找和最小的 K 对数字
 * 取小用大
 *
 * @author 是阿秋啊
 * @date 2022/03/16 16:13
 **/
public class Num373 {
    //定义自定义类，记录两数组值
    private class Pair implements Comparable<Pair> {
        //u来自第一个数组，v来自第二个数组
        int u;
        int v;

        public Pair(int u, int v) {
            this.u = u;
            this.v = v;
        }

        @Override
        public int compareTo(Pair o) {
            return (o.u + o.v) - (this.u + this.v);
        }
    }

    public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
        //创建优先队列，传入比较器，此时为最大堆
        Queue<Pair> queue = new PriorityQueue<>();
        //1.遍历两个数组，因为k有可能大于数组长度，所以终止条件要注音
        for (int i = 0; i < Math.min(k, nums1.length); i++) {
            for (int j = 0; j < Math.min(k, nums2.length); j++) {
                if (queue.size() < k) {
                    queue.offer(new Pair(nums1[i], nums2[j]));
                } else {
                    //当前两值和
                    int add = nums1[i] + nums2[j];
                    Pair pair = queue.peek();
                    if (add < pair.u + pair.v) {
                        queue.poll();
                        queue.offer(new Pair(nums1[i], nums2[j]));
                    }
                }
            }
        }
        //此时队列完成比较，将队列中的值传入数组
        List<List<Integer>> ret = new ArrayList<>();
        for (int i = 0; i < k && (!queue.isEmpty()); i++) {
            List<Integer> temp = new ArrayList<>();
            temp.add(queue.peek().u);
            temp.add(queue.peek().v);
            queue.poll();
            ret.add(temp);
        }
        return ret;
    }
}
